package com.dkh.recommend.utils.coreMaths;



import com.dkh.recommend.entity.TbRelate;
import com.dkh.recommend.utils.CoreMathsUtils;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 核心算法
 *
 */
public class UserCF {

    /**
     * 方法描述: 推荐音乐id列表
     *
     * @param userId 当前用户
     * @param list 用户音乐评分数据
     * @return {@link List<Long>}
     * @date 2023年02月02日 14:51:42
     */
    public static List<Long> recommend(Long userId, List<TbRelate> list) {
        //按用户分组
        Map<Long, List<TbRelate>>  userMap=list.stream().collect(Collectors.groupingBy(TbRelate::getUserId));
        //获取其他用户与当前用户的关系值
        Map<Long,Double>  userDisMap = CoreMathsUtils.computeNeighbor(userId, userMap,0);
        //获取关系最近的用户
        double maxValue=Collections.max(userDisMap.values());
        Set<Long> userIds=userDisMap.entrySet().stream().filter(e->e.getValue()==maxValue).map(Map.Entry::getKey).collect(Collectors.toSet());
        //取关系最近的用户
        Long nearestUserId = userIds.stream().findAny().orElse(null);
        if(nearestUserId==null){
            return Collections.emptyList();
        }
        //最近邻用户看过音乐列表
        List<Long>  neighborItems = userMap.get(nearestUserId).stream().map(TbRelate::getMusicId).collect(Collectors.toList());
        //指定用户看过音乐列表
        List<Long>  userItems  = userMap.get(userId).stream().map(TbRelate::getMusicId).collect(Collectors.toList());
        //找到最近邻看过，但是该用户没看过的音乐
        neighborItems.removeAll(userItems);
        return neighborItems;
    }

}
